perm filename XAPOLD[XGP,BGB] blob sn#043291 filedate 1973-05-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00026 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00004 00002	TITLE XAP - XEROX ASSEMBLE AND PRINT - BGB - 27 JANUARY 1973.
C00007 00003	ALTERNATE PDP-10 MNEMONICS.
C00010 00004	SUBR(MKBUF)	MAKE XGP BUFFER.
C00011 00005	SUBR(XGPOUT)	OUTPUT BUFFER TO XGP.
C00013 00006	SUBR(PLAG)G    	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
C00015 00007	SUBR(PRINT)CHR  	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
C00017 00008	INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.
C00018 00009	SUBR(PLTVEC)XN,YN	PLOT LINE SEGMENT INTO XGP BUFFER.
C00022 00010	SUBR(IIISIM)	OUTPUT III BUFFER ONTO XGP.
C00024 00011			FETCH AND DECODE III COMMAND WORD.
C00026 00012			IIISIM CONTINUED.
C00028 00013	SUBR(GETFIL)	GET FILE SPEC FROM TTY LINE.
C00030 00014	SUBR(INITIO)	GET AND OPEN A CHANNEL.
C00031 00015	SUBR(GETCHR)	GET CHARACTER AND SKIP.
C00033 00016	SUBR(INITXT)	INITIALIZE TEXT FILE.
C00035 00017	SUBR(DEFONT)	DEFINE A FONT.
C00039 00018	SUBR(SETFNT)	SETUP A FONT.
C00040 00019	START ADDRESS ENTRY.
C00042 00020	RPG-ENTRY.
C00044 00021	XGP PRINT A CHARACTER.
C00046 00022	EXECUTE COMMAND CHARACTERS.
C00047 00023	ESCAPE CHARACTER TABLE.
C00052 00024	XAP DOCUMENTATION.
C00053 00025	XAP TILDE COMMANDS.
C00055 00026	XAP RUBOUT COMMANDS.
C00059 ENDMK
C⊗;
TITLE XAP - XEROX ASSEMBLE AND PRINT - BGB - 27 JANUARY 1973.

	ORGBUF:0	;BUFFER FOR ONE PAGE OF XGP BINARY OUTPUT.
	ENDBUF:0
	ROW:0↔COL:0	;XGP "PEN" POSITION.
	DROW:0↔DCOL:0
	MAXFILES←←5	;NUMBER OF INDIRECTED FILES
	MAXFONT←←=9	;NUMBER OF FONTS

;XGP RASTER DIMENSIONS.
	WWIDTH←←=41		;WORD WIDTH OF A ROW.
	NCOLS←←(WWIDTH-1)*=36	;NUMBER OF COLUMNS.
	MROWS←←=2000		;NUMBER OF ROWS.
        BUFSIZ←←WWIDTH*MROWS	;SIZE OF XGP BUFFER.

;JOB DATA AREA.
	EXTERN JOBJDA	;140 END OF JOB DATA AREA.
	EXTERN JOBFF	;121 TOP OF USED CORE POINTER.
	EXTERN JOBSA	;120 XWD ORGINAL-TOP,START-ADDR.
	EXTERN JOBREL	; 44 PHYSICAL TOP OF CORE IMAGE.

	RMAR:NCOLS↔LMAR:=100
	ROWMIN:=100↔ROWMAX:MROWS

	FILNAM:	0	;FILE NAME.
	EXTION:	0↔0	;EXTENSION.
	PPPN:	0↔0	;PROJECT-PROGRAMMER.
	FNTPPN:	SIXBIT/XGPSYS/		;DEFAULT FONT PPN

	IOPTR:	0	;POINTER INTO FILE STACK
	IBUF:	BLOCK 4*MAXFILES	;FILE STACK
	CHANTB←IBUF+3
	TTYFLA:	0	;INPUT FROM TTY
	RPGSW:	0
	FONT: 0
	FONTAB: BLOCK =10
	PDL:	BLOCK 100	;CONTROL PUSH DOWN.
	PAT:	BLOCK 100	;PATCH AREA.
;ALTERNATE PDP-10 MNEMONICS.

	DEFINE O(A,B){OPDEF A[B]}
	O LIP,HLR↔O LAP,HRR↔O DIP,HRLM↔O DAP,HRRM
	O ZIP,HRRZS↔O ZAP,HLLZS↔O WIP,HRROS↔O WAP,HRRZS
	O CAR,HLRZ↔O LIPI,HRLI↔O LAPI,HRRI↔O DIPZ,HRLZM
	O CDR,HRRZ↔O LACI,MOVEI↔O SLACI,MOVSI↔O DAPZ,HRRZM
	O LAC,MOVE↔O LACN,MOVN↔O LACM,MOVM↔O SLAC,MOVS
	O DAC,MOVEM↔O DACN,MOVNM↔O DACM,MOVMM↔O SDAC,MOVSM
	O NIP,HLRE↔O NAP,HRRE↔O NIM,HRREI↔O GO,JRST
	O FLOAT,FSC 233↔O FIXX,FIX 233000↔O DZM,SETZM

;SAIL LIKE SUBROUTINE LINKAGE.

	↓P←←17
	DEFINE SUBR(NAME){INTERN NAME↔↓NAME: ;}
	DEFINE CALL(NAME,X1,X2,X3,X4){
	IFDIF <> <X1> {PUSH 17,X1↔IFDIF <> <X2> {PUSH 17,X2
	IFDIF <> <X3> {PUSH 17,X3↔IFDIF <> <X4> {PUSH 17,X4}}}}
	PUSHJ 17,NAME}
	DEFINE ARG1<-1(17)>↔DEFINE ARG2<-2(17)>
	DEFINE ARG3<-3(17)>↔DEFINE ARG4<-4(17)>
	DEFINE SETQ(VAR,LIST){CALL(LIST)↔DAC 1,VAR}

;RETURN FROM AN N-ARGUMENT SUBROUTINE CALL.

	DEFINE POP0J <POPJ 17,>
	↓POP1J.:SUB 17,[2(2)]↔GO@2(17)↔DEFINE POP1J<GO POP1J.>
	↓POP2J.:SUB 17,[3(3)]↔GO@3(17)↔DEFINE POP2J<GO POP2J.>
	↓POP3J.:SUB 17,[4(4)]↔GO@4(17)↔DEFINE POP3J<GO POP3J.>
	↓POP4J.:SUB 17,[5(5)]↔GO@5(17)↔DEFINE POP4J<GO POP4J.>

;ACCUMULATOR AND TEMPORARY DATA MANAGEMENT.

	DEFINE ACCUMULATORS(LIST){ACPTR←←2
	FOR AC⊂(LIST)<AC←ACPTR↔ACPTR←←ACPTR+1↔>}
	DEFINE DECLARE (LIST){
	FOR VARNAM⊂(LIST)<VARNAM: 0↔>}

;FATAL ERROR MESSAGE.

	DEFINE FATAL(STR){PUSHJ 17,FATAL.↔ASCIZ/STR/}
	FATAL.:OUTSTR[BYTE(7)15,12(21)"FAT"↔"AL - "⊗1↔0]
	OUTSTR @(17)↔INCHRW↔GO .-1↔LIT
	DEFINE CRLF{OUTSTR[BYTE(7)15,12]}
	%←←400000
SUBR(MKBUF)	MAKE XGP BUFFER.
BEGIN MKBUF;------------------------------------------------------

;EXPAND CORE FOR XGP BUFFER.
	CDR JOBFF↔DAC ORGBUF
	ADDI BUFSIZ↔DAC ENDBUF↔AOS ORGBUF
	ADDI 10↔DAC JOBFF↔IORI 1777
	CALLI 11↔GO [FATAL(CAN'T GET CORE FOR XGP BUFFER)]

;CLEAR XGP BUFFER.
	LAC 1,ORGBUF↔SETZM(1)
	DIP 1,1↔AOS 1↔BLT 1,@ENDBUF
	POP0J

BEND MKBUF;BGB 27 JANUARY 1973.-----------------------------------
SUBR(XGPOUT)	OUTPUT BUFFER TO XGP.
BEGIN XGPOUT;-----------------------------------------------------

;PUT CONTROL WORD IN EACH ROW.
	LAC[1B11+=100B23]↔ADDI WWIDTH-1
	LAC 1,ORGBUF
	LACI 2,MROWS		;NUMBER OF ROWS.
	DAC(1)↔ADDI 1,WWIDTH	;ROW WORD WIDTH.
	SOJG 2,.-2

;CALL THE IOTS.
	LAC ORGBUF↔SOS↔DAP OUT2
	INIT 2,17↔SIXBIT/XGP/↔0↔HALT
	SETZ 1,
	SEGNUM 1,
	DETSEG
	LOCK
	OUTSTR[ASCIZ/OUTPUTING PAGE TO XGP.../]
	OUT 2,OUT1
	SKIPA
	OUTSTR[ASCIZ/XGP GAVE AN ERROR RETURN.
/]
	UNLOCK
	RELEASE 2,
	OUTSTR[ASCIZ/PAGE FINISHED.
/]
	JUMPE 1,.+3
	ATTSEG 1,
	GO [OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY.	/]
	    HALT .+1]

;CLEAR XGP BUFFER.
	LAC 1,ORGBUF↔SETZM(1)
	DIP 1,1↔AOS 1
	CDR 2,ENDBUF↔BLT 1,(2)
	POP0J

;-----------------------------------------------------------------
OUT1:	IOWD 2,HACK1
OUT2:	IOWD BUFSIZ,0
OUT3:	IOWD 2,HACK2
	0

HACK1:	1B0
	1B0 + =80B11
HACK2:	1B0 + =80B11
	0↔0
BEND;1/31/73------------------------------------------------------
SUBR(PLAG)G    	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
BEGIN PLAG;-------------------------------------------------------
;BGB - 27 JANUARY 1973.

	ACCUMULATORS{G,B,B2,M,N,I}
	LAC G,ARG1

;ORIGIN AND BUFFER POINTER.

	NIP 1(G)↔ADD ROW↔DAC ROW
	IMULI WWIDTH↔ADD ORGBUF↔DAPZ B

	NAP 1(G)↔ADD COL↔DAC COL
	IDIVI =36↔AOS
	ADD B,0↔MOVNS 1↔DAP 1,L3

	CAR M,0(G)↔CDR N,0(G)
	DIP G,G↔ADDI G,3
	DAC B,B2

;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.

L1:	LAC I,N
L2:	LAC 0,(G)↔SETZ 1,
L3:	LSHC 0,0
	CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 0,(B)
	AOS B
	CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 1,(B)
	AOS G
	SOJG I,L2↔LAC B,B2
	ADDI B,WWIDTH↔DAC B,B2
	SOJG M,L1↔LIP G,G

;TERMINUS.

	NIP 2(G)↔ADD ROW↔DAC ROW
	NAP 2(G)↔ADD COL↔DAC COL
	POP1J
BEND;1/27/73------------------------------------------------------
SUBR(PRINT)CHR  	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
BEGIN PRINT;------------------------------------------------------

	ACCUMULATORS{G,B,B2,M,N,I}

	LAC 1,FONT		;CURRENT FONT NUMBER.
	LAC 2,FONTAB(1)		;FONT BASE ADDRESS.
	LAC 0,203(2)		;ROWS BETWEEN TOP AND BASE LINE.
	ADD 2,ARG1		;POINTER INTO FONT'S CHARACTER TABLE.
	CAR N,(2)		;COLS WIDE OF THE GLYPH.
	CDR G,(2)
	ADD G,FONTAB(1)↔AOS G	;CHARACTER'S GLYPH POINTER.
	CDR M,(G)		;ROWS HIGH OF THE GLYPH.
	CAR 1,(G)		;ROWS FROM TOP TO FIRST ROW OF GLYPH.
	SUB 0,1			;ROWS ABOVE CURRENT XGP PEN POSITION.
	ADD 0,ROW
	IMULI WWIDTH
	ADD ORGBUF↔DAPZ B	;WORD POINTER INTO XGP BUFFER.
	LAC 0,COL↔IDIVI 0,=36	;REMAINDER IN AC-1 !
	AOS↔ADD B,0		;WORD POINTER INTO XGP BUFFER.
	ADDM N,COL		;UPDATE XGP PEN COLUMN POSITION.

	TLO G,444400		;SETUP GLYPH BYTE POINTER.
	CAIL N,=36↔GO[
	IDIVI N,=36↔AOJA N,L0]	;WHEN CHARACTER WIDTH ≥ =36.
	DPB N,[POINT 6,G,11]	;SIZE OF BYTE.
	ADDI 1,-=35(N)		; =36 - CHRWID - REMAINDER
	LACI N,1
L0:	MOVNS 1↔DAP 1,L3	;BYTE POSITION WITH RESPECT TO WORD BOUNDARYS.
;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.

L1:	LAC I,N
L2:	ILDB 0,G↔SETZ 1,
L3:	LSHC 0,0
	CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 0,(B)↔JUMPE 1,L4
	AOS B
	CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 1,(B)
L4:	SOJG I,L2↔LAC B,B2
	ADDI B,WWIDTH↔DAC B,B2
	SOJG M,L1↔POP1J

BEND PRINT;BGB 23 MAY 1973.---------------------------------------
SUBR(PLTVEC)XN,YN	;PLOT LINE SEGMENT INTO XGP BUFFER.
BEGIN PLTVEC;-----------------------------------------------------
ACCUMULATORS {DX,DY,D,E,F,T,X0,Y0,ONE,MOVE1}
	PTR←1
	LAC X0,COL
	LAC Y0,ROW
	LAC -2(P)
	CAIL NCOLS↔GO[OUTSTR[ASCIZ/VECTOR OFF SCREEN → /]↔POP2J]
	JUMPL[OUTSTR[ASCIZ/VECTOR OFF SCREEN ← /]↔POP2J]
	DAC COL
	LAC -1(P)
	CAIL MROWS↔GO[OUTSTR[ASCIZ/VECTOR OFF SCREEN ↓ /]↔POP2J]
	JUMPL[OUTSTR[ASCIZ/VECTOR OFF SCREEN ↑ /]↔POP2J ]
	DAC ROW
	CAMLE X0,-2(P)↔GO[EXCH X0,-2(P)↔EXCH Y0,-1(P)↔GO C1]
C1:	LAC PTR,X0
	IDIVI PTR,=36
	MOVN DX,DX
	DPB DX,[POINT 6,PTR,5]
	ADD PTR,[XWD 440100,0]
	LAC DX,Y0
	IMULI DX,WWIDTH
	ADD PTR,DX
	ADD PTR,ORGBUF
	ADDI PTR,1
	DPB ONE,PTR
C0:	MOVEI ONE,1		;INITIALIZE CONSTANT FOR LOOP
	LAC DX,-2(P)↔SUB DX,X0	;DX←XN-X0;
	LAC DY,-1(P)↔SUB DY,Y0	;DY←YN-Y0;
	SKIPN DX
	JUMPE DY,POP2J.
	LAC D,DX↔ADD D,DY	;D←DX+DY;
	LAC T,DY↔SUB T,DX	;T←DY-DX;
	SETZ MOVE1,		;MOVE1←0;
	SKIPL DY		;IF DY≥0
	MOVEI MOVE1,2		;	 THEN MOVE1←2;
	SKIPL D			;IF D≥0 
	ADDI MOVE1,2		;	THEN MOVE1←MOVE1+2;
	SKIPL T			;IF T≥0 
	ADDI MOVE1,2		;	THEN MOVE1←MOVE1+2;
	JUMPGE DX,[MOVN MOVE1,MOVE1	;IF DX≥0 THEN MOVE1←8-MOVE1
	     ADDI MOVE1,=8
	     GO C2]		;
	ADDI MOVE1,=10		;	 ELSE MOVE1←MOVE1+10;
C2:	MOVM DX,DX		;DX←ABS(DX);
	MOVM DY,DY		;DY←ABS(DY);
	LAC F,DX↔ADD F,DY	;F←DX+DY;
	LAC D,DY↔SUB D,DX	;D←DY-DX;
	JUMPGE D,[LAC T,DX	;IF D≥0 THEN BEGIN T←DX;
	     MOVN D,D↔GO C3]	;	                 D←-D; END
	LAC T,DY		;	ELSE T←DY;
C3:	SETZ E,			;E←0;
LOOP:	LAC DX,D↔ADD DX,E	;DX←D+E;
	LAC DY,T↔ADD DY,E
	ADD DY,DX		;DY←T+E+DX;
	JUMPGE DY,[LAC E,DX	;IF DY≥0 THEN BEGIN E←DX;
		   SUBI F,1	;	    F←F-1; COMMENT F←F-1 IS DONE OUTSIDE IF;
		   JRST @CODE(MOVE1)];	    PLOT(MOVE1); END
	ADD E,T			;	 ELSE BEGIN E←E+T; COMMENT F←F-1 IS LATER;
	JRST @CODE-1(MOVE1)	;	    PLOT(MOVE1-1); END
C4:	SOJG F,LOOP		;IF F>0 THEN GO LOOP;	COMMENT F←F-1 IS DONE HERE;
	POP2J
CODE:	C
	@C+1↔@C+2↔@C+3↔@C+2↔@C+3↔@C+4↔@C+5↔@C+4
	@C+5↔@C+6↔@C+7↔@C+6↔@C+7↔@C+8↔@C+1↔@C+8
C:	HALT .
	[ADDI PTR,WWIDTH↔DPB ONE,PTR↔SOJG F,LOOP↔POP2J]		;1 +Y
	[ADDI PTR,WWIDTH↔IDPB ONE,PTR↔SOJG F,LOOP↔POP2J]	;2 +X+Y
	[IDPB ONE,PTR↔SOJG F,LOOP↔POP2J]			;3 +X
	[SUBI PTR,WWIDTH↔IDPB ONE,PTR↔SOJG F,LOOP↔POP2J]	;4 +X-Y
	[SUBI PTR,WWIDTH↔DPB ONE,PTR↔SOJG F,LOOP↔POP2J]		;5 -Y
	HALT .							;6 -X-Y
	HALT .							;7 -X
	HALT .							;8 -X+Y
BEND;2/8/73/(TVR)-------------------------------------------------
SUBR(IIISIM)	OUTPUT III BUFFER ONTO XGP.
BEGIN IIISIM______________________________________________________

;III SCALE COMMAND CHARACTRER  -  MULFAC IS # OF COLS FULL SCREEN.
	CALL(GETCHM)↔IMULI 1,NCOLS
	ASH 1,-6↔DAC 1,MULFAC#

;III FILE NAME.
	CALL(GETFIL)↔POP0J
	CALL(INITIO,[17],[SIXBIT/DSK/],[0])
	GO[FATAL(CAN'T INIT DSK)]
	DAC 1,IIICHN#
	CALL(IO,[LOOKUP FILNAM],IIICHN)↔GO FRET

;EXPAND CORE FOR DUMP INPUT.
	NIP 1,PPPN↔MOVN 1,1
	ADD 1,JOBFF↔DAC 1,BUFEND#
	CORE 1,↔GO [FATAL(CAN'T EXPAND CORE)]

;SAVE CURRENT BEAM POSITION.
	LAC COL↔DAC BEGCOL#
	LAC ROW↔DAC BEGROW#

;DUMP III FILE IN.
	LAC JOBFF↔ADDM PPPN
	CALL(IO,[IN PPPN],IIICHN)
	LAC 1,JOBFF↔ADDI 1,2↔DAC 1,PC#		;III PC.
	OUTSTR[ASCIZ/READING III BUFFER.../]
L1:	CDR 1,BUFEND↔DZM -1(1)↔DZM(1)
        CAIL 1,JOBREL↔GO .+3
	LIPI -1(1)↔BLT JOBREL			;CLEAR TOP.
		;FETCH AND DECODE III COMMAND WORD.
ILOOP:	AOSA 1,PC
LOOP:	LAC 1,PC↔CAMLE 1,JOBFF
	CAML 1,BUFEND↔GO RET
	LAC 2,(1)
	TRNE 2,01↔GO XTEXT	;TEXT COMMAND WORD.
	TRNE 2,02↔GO XVECTR	;VECTOR COMMAND WORD.
	TRNE 2,20↔GO XCTRL	;III CONTROL WORD.
	TRNE 2,37↔GO ILOOP	;NOP & HALT COMMANDS.
	GO RET

;EXECUTE III TEXT.
XTEXT:	PUSH P,2			;-2(P)
	PUSH P,[5]			;-1(P)
	PUSH P,[POINT 7,-2(P)]		; 0(P)
CLOOP:	ILDB 1,0(P)↔JUMPE 1,CCONT
	CAIN 1,15↔GO[LAC -4(P)↔DAC COL↔GO CCONT]
	CDR  1,%(1)
	ADDI 1,%
	CALL(PLAG,1)
CCONT:	SOSLE -1(P)↔GO CLOOP
	SUB P,[XWD 3,3]
	GO ILOOP

;EXECUTE VECTORS.
XVECTR:	TRNN 2,4
	GO [TRNN 2,10	;SHORT VECTOR OR TSS
	    GO SVECT	;SHORT VECTOR
	    GO ILOOP]	;TSS
	LDB [POINT 11,2,10]↔ROT -13	;X
	PUSHJ P,GRONK
	LDB [POINT 11,2,21]↔ROT -13	;Y
	MOVN↔PUSHJ P,GRONK
	LDB 1,[POINT 3,2,31]
	PUSHJ P,@PLOTAB(1)
	GO ILOOP

;EXECUTE III CONTROL OPERATIONS.
XCTRL:	TRNN 2,04↔GO[CAR 1,2↔DAC 1,PC↔GO LOOP]	;JUMP.
	TRNE 2,40↔GO LOOP	;SAVE A NOP HERE
	AOS 1,PC	;JSR
	HRLI 1,20
	CAR 2,2
	CAMLE 2,JOBFF
	CAML 2,BUFEND↔GO[ OUTSTR[ASCIZ/JSR OUT OF BOUNDS
/]↔	GO RET]
	DAC 1,(2)↔DAC 2,PC
	GO ILOOP
		;IIISIM CONTINUED.
RET:	AOS(P)↔OUTSTR[ASCIZ/FINISHED
/]
FRET:	CALL(IO,[RELEASE],IIICHN)
	LAC 1,JOBFF
	CORE 1,↔GO [FATAL(CAN'T SHRINK CORE!)]
	LAC BEGCOL↔DAC COL
	LAC BEGROW↔DAC ROW
	POP0J

SVECT:	PUSH P,2
	LDB [POINT 7,2,6]↔ROT -7
	PUSHJ P,GRONK
	LDB [POINT 7,2,13]↔ROT -7
	MOVN
	PUSHJ P,GRONK
	LDB 1,[POINT 2,2,15]
	PUSHJ P,@PLOTAB(1)

	POP P,2
	LDB [POINT 7,2,22]↔ROT -7
	PUSHJ P,GRONK
	LDB [POINT 7,2,29]↔ROT -7
	PUSHJ P,GRONK
	LDB 1,[POINT 2,2,31]
	PUSHJ P,@PLOTAB(1)
	GO ILOOP
GRONK:	ADD[2B2]
	MUL MULFAC
	EXCH 0,(P)
	JRST @0
PLOTAB:	[RVECT:	CALL(RELATE)↔CALL(PLTVEC,1,2)↔POP2J]
	[RPNT:	CALL(RELATE)↔DAC 1,COL↔DAC 2,ROW↔GO PLTVEC]
	[RIVECT: CALL(RELATE)↔DAC 1,COL↔DAC 2,ROW↔POP2J]
	RPNT
	[AVECT: CALL(ABSOLUTE)↔GO PLTVEC] ;ARGS ARE ALREADY STACKED
	[APNT:	CALL(ABSOLUTE)↔DAC 1,COL↔DAC 2,ROW↔GO PLTVEC]
	[AIVECT: CALL(ABSOLUTE)↔DAC 1,COL↔DAC 2,ROW↔POP2J]
	APNT
RELATE:	MOVSI -200000↔MUL MULFAC↔LAC 1,0↔ADD 1,COL↔ADDB 1,-3(P)
	LAC 2,0↔ADDB 2,-2(P)↔ADD 1,ROW↔POP0J
ABSOLU:	LAC 1,BEGCOL↔ADDB 1,-3(P)↔LAC 2,BEGROW↔ADDB 2,-2(P)↔POP0J
BEND;2/8/73/(TVR)21 MAY 1973(BGB)---------------------------------
SUBR(GETFIL)	;GET FILE SPEC FROM TTY LINE.
BEGIN GETFIL;_____________________________________________________

	SETZM FILNAM↔SETZM EXTION
	SETZM EXTION+1↔SETZM PPPN
	LAC 4,[POINT 6,FILNAM,-1]↔LACI 2,6
	CALL(GETCHR)↔POP0J↔CAIN 1,15↔GO[CALL(GETCHR)↔POP0J↔POP0J]↔AOS(P)
	JRST L+2
L:	CALL(GETCHR)↔POP0J
	CAILE 1,"z"↔POP0J
	CAIL 1,"a"↔SUBI 1,40		;CONVERT LOWER CASE
	CAIN 1,"."↔GO[LAC 4,[POINT 6,EXTION,-1]↔LACI 2,3↔GO L]
	CAIN 1,"["↔GO[LAC 4,[POINT 6,PPPN,-1]  ↔LACI 2,3↔GO L]
	CAIN 1,","↔GO[CAR PPPN
		      PUSHJ P,[PPJUST:	JUMPE [OUTSTR[ASCIZ/BAD P,PN/]
						CLRBFI↔SOS -1(P)↔CRLF↔POP1J]	
		   	 		TRNE 77↔POP0J↔LSH -6↔GO PPJUST]
		      DIP PPPN↔LAC 4,[POINT 6,PPPN,17]↔LACI 2,3↔GO L]
	CAIN 1,"]"↔GO[CDR PPPN↔CALL(PPJUST)
		   DAP PPPN↔CALL(GETCHR)↔POP0J↔GO FINQ]
FINQ:	CAIN 1,15↔GO EOL			;END OF THE LINE.
	CAIN 1,12↔POP0J
	CAIN 1,"→"↔POP0J
	CAIG 1," "↔GO L	;IGNORE GARBAGE.
	SOJL 2,L↔SUBI 1,40↔IDPB 1,4↔GO L

EOL:	CALL(GETCHR)↔POP0J↔POP0J
BEND;1/31/73,2/7/73(TVR)----------------------------------------------
SUBR(INITIO)	GET AND OPEN A CHANNEL.
BEGIN INITIO;_____________________________________________________
	MOVEI 1,17		;SEARCH FOR FREE CHANNEL
	SKIPE JOBJDA(1)
	SOJGE 1,.-1
	JUMPL 1,[OUTSTR[ASCIZ+OUT OF I/O CHANNELS!
+]↔	POP3J]
	LAC [	OPEN -3(P)]
	DPB 1,[POINT 4,0,12]
	XCT 0
	POP3J
	AOS (P)
	POP3J
BEND;2/7/73/(TVR)-------------------------------------------------

SUBR(IO,OPCODE,CHAN)----------------------------------------------
BEGIN IO
	LAC -1(P)
	DPB [POINT 4,-2(P),12]
	XCT -2(P)
	POP2J
	AOS (P)
	POP2J
BEND;2/7/73/(TVR)-------------------------------------------------
SUBR(GETCHR)	GET CHARACTER AND SKIP.
BEGIN GETCHR;_____________________________________________________
	SKIPE TTYFLAG↔GO[INCHWL 1↔AOS(P)↔POP0J]
	SKIPGE 1,IOPTR↔POP0J
	SOSLE IBUF+2(1)
	GO[RETCHR: ILDB 1,IBUF+1(1)↔AOS(P)↔POP0J]
	CALL(IO,[IN],<CHANTB(1)>)
	GO RETCHR
	CALL(IO,[STATO 1B22],<CHANTB(1)>)
	GO [OUTSTR[ASCIZ/READ ERROR	/]
	    HALT RETCHR]
	CALL(IO,[RELEASE],<CHANTB(1)>)	;EOF.
	SUBI 1,4
	DAC 1,IOPTR
	GO GETCHR
	POP0J
BEND;2/7/73(TVR)--------------------------------------------------

SUBR(GETCHM)	GET CHARACTER.
BEGIN GETCHM
	CALL(GETCHR)
	GO [FATAL(UNEXPECTED EOF)]
	POP0J
BEND GETCHM;2/7/73(TVR)-------------------------------------------

SUBR(RDNUM)-------------------------------------------------------
BEGIN RDNUM;
	CALL(GETCHM)↔HRREI 2,-100(1)↔ASH 2,7   ;7 HIGH ORDER BITS.
	CALL(GETCHM)↔LAC 0,2↔ADD 0,1	       ;7 LOW  ORDER BITS.
	POP0J
BEND RDNUM;-------------------------------------------------------

SUBR(RDPAIR)------------------------------------------------------
BEGIN RDPAIR;
	CALL(RDNUM)↔LAC 3,0↔JUMPL XLOSE↔CAILE NCOLS
	GO[XLOSE: CALL(RDNUM)↔POP0J]
	CALL(RDNUM)↔JUMPL YLOSE↔CAILE MROWS
	GO[YLOSE: POP0J]
	AOS(P)↔POP0J
BEND RDPAIR;------------------------------------------------------
SUBR(INITXT)	INITIALIZE TEXT FILE.
BEGIN INITXT;_____________________________________________________
	LACI 2,4↔ADD 2,IOPTR
	CAIL 2,4*MAXFILES↔GO[FATAL(TOO MANY INDIRECT FILES!)]
	LACI IBUF(2)
	CALL (INITIO,[0],[SIXBIT/DSK/],0)↔GO[FATAL(CAN'T INIT DSK)]
	DAC 1,CHANTB(2)
	SKIPE TTYFLAG↔OUTSTR [ASCIZ/TEXT: /]
	CALL(GETFIL)↔GO FRET
	CAIE 1,12↔GO[OUTSTR[ASCIZ/ILLEGAL FILE TERMINATOR:/]
		     OUTCHR 1↔GO FRET]
	LACI 2,4↔ADDB 2,IOPTR
	CALL (IO,[LOOKUP FILNAM],<CHANTB(2)>)
	GO[OUTSTR[ASCIZ/FILE NOT FOUND.
/]
	   FRET: LACI 2,4↔SUBM 2,IOPTR↔CALL(IO,[RELEASE],<CHANTB(2)>)
		 POP0J]
	AOS(P)	
	POP0J
BEND;2/7/73(TVR)--------------------------------------------------
SUBR(DEFONT)	DEFINE A FONT.
BEGIN DEFONT;_____________________________________________________
	PUSH P,[17]
	PUSH P,[SIXBIT/DSK/]
	PUSH P,[0]
	PUSHJ P,INITIO			;INITIALIZE
	GO [FATAL(CAN'T INIT DSK)]
	DAC 1,FONTCH
	SKIPE TTYFLAG
	OUTSTR [ASCIZ/FONT: /]
	CALL(GETFIL)↔POP0J
	CAIE 1,"→"↔CAIN 1,12↔GO OK
	OUTSTR[ASCIZ/ILLEGAL FILE TERMINATOR:/]↔CALL(ONECHR)↔CLRBFI↔GO FRET]
OK:	CALL (IO,[LOOKUP FILNAM],FONTCH)
	GO [	HRLI 'XAP'↔SKIPN EXTION↔HLLZM EXTION
		CALL (IO,[LOOKUP FILNAM],FONTCH)
		GO [	LAC FNTPPN↔SKIPN PPPN↔DAC PPPN
			CALL (IO,[LOOKUP FILNAM],FONTCH)
			GO [	OUTSTR[ASCIZ/NOT FOUND, TRY AGAIN
/]
				POP0J]
			GO .+1]
		GO .+1]
	CAIN 1,"→"↔GO [	CALL(GETCHM)		;DEFINING FONT NUMBER ≠0?
		CAIL 1,"0"↔CAIL 1,"0"+MAXFONT
		GO [OUTSTR[ASCIZ/ILLEGAL FONT NUMBER:/]
		    CLRBFI↔CALL(ONECHR)↔CRLF↔GO FRET]
		INCHSL↔JFCL↔CAIE 12↔INCHSL↔JFCL
		SUBI 1,"0"↔GO CONT]
	SETZ 1,
↑RPGFNT:				;ENTRY FOR RPG MODE
CONT:	DAC 1,FONT
	SETZ↔SEGNUM			;GET SEGMENT NUMBER
	CAMN FONTAB(1)↔GO SEGOK		;IF SAME AS TABLE, WE WIN
	SKIPE 0↔DETSEG			;DETACH CURRENT SEGMENT IF ANY
	LAC FONTAB(1)			;GET NUMBER OF DESIRED SEGMENT
	JUMPE SEGOK
	ATTSEG
	GO [OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY!	/]
	    HALT SEGOK]
SEGOK:	LAC PPPN↔LAPI %↔SOS↔DAC INARG		;IOWD.
	MOVS PPPN↔MOVMS↔ADDI %
	DAC MAXADR↔CORE2↔HALT	;MAKE UPPER SEG.
	SKIPN FONTAB(1)↔GO[SETZ↔SEGNUM
		DAC FONTAB(1)			;REMEMBER SEG, NUMBER
		LAC[SIXBIT/FONT00/]↔ADD 1
		CALLI %+36↔JFCL↔GO RDFONT]	;NAME UPPER SEG.
RDFONT:	CALL (IO,[IN [INARG:0↔0]],FONTCH])
	LACI 1,177			;CONSISTANCY CHECKING HERE
CKLOOP:	SKIPLE 2,%(1)↔GO[ADDI 2,%↔CAML 2,MAXADR↔GO BADFNT
		CDR (2)↔CDR 3,(2)↔IMUL 3↔ADDI %+3(2)
		CAML MAXADR↔GO BADFNT
		SOJGE 1,CKLOOP↔GO FONTOK]
	ADDI 2,SPTABE-SPTABL↔JUMPL 2,BADFNT↔SOJGE 1,CKLOOP
FONTOK:	CALL(SETFNT)
	AOS (P)
FRET:	CALL (IO,[RELEASE],FONTCH)
	POP0J
BADFNT:	OUTSTR[ASCIZ/BAD CHARACTER IN FONT #/]
	LACI 0,"0"↔ADD 0,FONT↔OUTCHR 0
	OUTSTR[ASCIZ/:/]↔CALL(ONECHR)↔SETZM %(1)
	CRLF↔SOJGE 1,CKLOOP↔GO FONTOK
↑FONTCH: 0
MAXADR:	 0
BEND DEFONT;2/7/72(TVR)-------------------------------------------
SUBR(ONECHR)------------------------------------------------------
BEGIN ONECHR
	JUMPE 1,[OUTSTR [ASCIZ/<NULL>/]↔POP0J]
	CAIN 1," "↔GO[OUTSTR[ASCIZ/<SPACE>/]↔POP0J]
	CAIL 1,11↔CAILE 1,15↔GO[OUTCHR 1↔POP0J]
	OUTSTR @[[ASCIZ/<TAB>/]
		 [ASCIZ/<LF>/]
		 [ASCIZ/<VT>/]
		 [ASCIZ/<FF>/]
		 [ASCIZ/<CR>/]]-11(1)
	POP0J
BEND ONECHR;2/7/72(TVR)-------------------------------------------
SUBR(SETFNT)	SETUP A FONT.
BEGIN SETFNT;_____________________________________________________
	LACI =40↔DAC DROW		;LINE FEED DEFAULT.
	LAC 2,%+12↔JUMPN 2,[		;LINE FEED SPECIFIED.
		NIP 0,%+1(2)↔NIP 1,%+2(2)
		ADD 0,1↔DAC 0,DROW↔GO .+1]

	LACI =25↔DAC DCOL		;SPACE DEFAULT.
	LAC 2,%+40↔JUMPN 2,[		;SPACE SPECIFIED.
		NAP 0,%+1(2)↔NAP 1,%+2(2)
		ADD 0,1↔DAC 0,DCOL↔GO .+1]
	POP0J
BEND SETFNT;2/7/72(TVR)-------------------------------------------
;START ADDRESS ENTRY.
SA:	TDCA
RPGSA:	SETA↔DAC RPGSW
	CALLI 0				;RESET I/O AND CORE
	CAR JOBSA↔DAC JOBFF
	CORE↔JFCL			;CORE DOWN
	LAC 17,[IOWD 100,PDL]		;INITIALIZE TABLES
	SETZM FONTAB
	LAC[XWD FONTAB,FONTAB+1]↔BLT FONTAB+9
	SETZM LMAR↔LACI =1440↔DAC RMAR

;RE-ENTRY ADDRESS.
REE:	LACI .↔DAC 124
	LACI 4↔MOVNM IOPTR
	SETOM TTYFLAG
	SKIPE RPGSW↔GO RPG

;INITIALIZE XGP BUFFER.
restar:	CALL(DEFONT)↔GO .-1
	CALL(INITXT)↔GO .-1
RPGCON:	SETZM TTYFLAG
	CALL(MKBUF)

;DEFAULT INITIALIZE MARGINS.
        LACI =100↔DAC ROWMIN↔DAC ROW
	LACI MROWS-=200↔DAC ROWMAX
	LACI =100↔DAC LMAR↔DAC COL
	LACI NCOLS↔DAC RMAR
	GO XPRINT
;RPG-ENTRY.
RPG:	SETZM RPGSW
	CALL(INITIO,[0],[SIXBIT/DSK/],[IBUF])
	GO[FATAL(CAN'T INIT DSK!)]
	DAC 1,CHANTB
	CALL(IO,[LOOKUP 4],CHANTB);
	GO[OUTSTR[ASCIZ/TEXT FILE NOT FOUND - GETRPG
/]↔	   GO SA]
	SETZM IOPTR
	CALL(INITIO,[17],[SIXBIT/DSK/],[0])
	GO[FATAL(CAN'T INIT DSK!)]
	DAC 1,FONTCH
	CALL(IO,[LOOKUP 10],FONTCH);
	GO[OUTSTR[ASCIZ/FONT FILE NOT FOUND - GETRPG
/]↔	   GO SA]
	DAC 13,PPPN		;SAVE LENGTH
	LAC 1,14
	JUMPL 1,[RPGLOSE: OUTSTR[ASCIZ/ILLEGAL FONT NUMBER
/]
			GO SA]
	CAILE 1,MAXFONT
	GO RPGLOSE
	CALL(RPGFNT)
	GO [OUTSTR[ASCIZ/BAD FONT FILE
/]↔	GO SA]
	OUTSTR [ASCIZ/XAP INITIALIZED IN RPG MODE.
/]
	GO RPGCON
;XGP PRINT A CHARACTER.
XPRINT:	CALL(GETCHR)↔GO FINISH				;EOF.
	JUMPE 1,XPRINT					;NULL.
	CAIN 1,11↔GO[LAC COL↔SUB LMAR↔IDIV DCOL		;TAB.
		ANDCMI 7↔ADDI 8↔IMUL DCOL↔ADD LMAR
		DAC COL↔GO XPRINT]
	CAIN 1,15↔GO[LAC LMAR↔DAC COL↔GO XPRINT]		;RETURN.
	CAIN 1,14↔GO[FORMFEED: CALL(XGPOUT)		;FF.
		LAC ROWMIN↔DAC ROW	
		LAC LMAR↔DAC COL↔GO XPRINT]
 	CAIN 1,40↔GO[SPACE: LAC DCOL↔ADDM COL↔GO COLCHK];SPACE.
	CAIN 1,12↔GO[LAC DROW↔ADDM ROW↔GO ROWCHK]	;LINE FEED
	CAIN 1,177↔GO ESC1		;B.S. (default special char.)

;FONT TABLE LOOKUP AND PLACE CHARACTER'S GLYPH INTO XGP BUFFER.
HIDDEN:	HRRE 0,%(1)
	JUMPLE SPCHAR↔ADDI %
	CALL(PLAG,0)

;COLUMN OVERFLOW - DEFAULT CRLF.
COLCHK:	LAC COL↔CAMLE RMAR↔GO[LAC LMAR↔DAC COL↔LAC DROW
			ADDM ROW↔GO ROWCHK]
ROWCHK:	LAC ROW↔CAMGE ROWMAX↔GO XPRINT↔GO FORMFEED	;ROW OVERFLOW.

FINISH:	CALL(XGPOUT)↔CALLI 0				;FLUSH BUFFERS
	LAC JOBFF
	CORE↔OUTSTR[ASCIZ/COULDN'T SHRINK CORE/]	;AND THEIR CORE
	MOVEI 1,MAXFONT
FINIS2:	LAC FONTAB(1)↔ATTSEG↔JFCL↔SETZ↔CORE2
		JFCL↔SOJGE 1,FINIS2			;FLUSH UPPER(S)
	CALLI 12					;EXIT

;EXECUTE COMMAND CHARACTERS.
SPCHAR:
	ADDI SPTABEND
	LAC @0
	JRST @0
SPTABL:
	ESC1		;-1  BINARY FORM OF ESCAPE
SPTABE:	[LAC %+" "
	 DAC %(1)
	 OUTSTR[ASCIZ/UNDEFINED CHARACTER:/]
	 CALL(ONECHR)
	 CRLF
	 JRST SPACE]	; 0  UNDEFINED CHARACTER

ESC1:	CALL(GETCHM)
	SKIPE ESC1TB(1)
	JRST @ESC1TB(1)
	OUTSTR [ASCIZ/UNDEFINED COMMAND:/]
	CALL(ONECHR)
	CRLF
	JRST XPRINT
;ESCAPE CHARACTER TABLE.

ESC1TB:	HIDDEN				;CENTER DOT
	0↔0↔0↔0↔0↔0↔0			;0-6 ↓αβ∧¬επ
	[CALL(DEFONT)			;7 λ (DEFINE A FONT)
	 GO [OUTSTR[ASCIZ/FONT NOT FOUND.
/]↔	     GO XPRINT]
	 GO XPRINT]
	HIDDEN↔0↔HIDDEN↔HIDDEN↔HIDDEN	;11-15 (HIDDEN CHARACTERS)
	0↔0				;16-17 ∞∂
	[MOVEI 2↔GO PARTPG]		;20 ⊂ (1/2 PAGE)
	[OUTSTR[ASCIZ/CAN'T CROSS PAGE BOUNDARIES, SORRY/]
	 LAC DROW↔ADDM ROW↔GO ROWCHK]	;21 ⊃
	[MOVEI 3↔IMUL DROW↔ADDM ROW
	GO ROWCHK]			;22 ∩ (3 LINES)
	[MOVEI 3↔GO PARTPG]		;23 ∪ (1/3 PAGE)
	[MOVEI 6↔GO PARTPG]		;24 ∀ (1/6 PAGE)
	0↔[PUSHJ P,IIISIM↔JFCL↔GO XPRINT]↔0	;25-27 ∃⊗↔
	0↔0↔0↔0↔0↔0↔0↔0			;30-37 _→~≠≤≥≡∨
	[PUSHJ P,SXINC↔GO COLCHK]	;40 (SPACE, INC X POS)
	0↔0↔0↔0↔0↔0↔0			;41-47 !"#$%&'
	0↔0↔0↔0↔0↔0↔0↔0			;50-57 ()*+,-./
	CHGFNT↔CHGFNT↔CHGFNT↔CHGFNT	;60-63 0123 (SET FONT NUMBER)
	CHGFNT↔CHGFNT↔CHGFNT↔CHGFNT	;64-67 4567 (SET FONT NUMBER)
	CHGFNT↔CHGFNT			;70-71 89 (SET FONT NUMBER)
	0↔0↔0↔0↔0↔0			;72-77 :;<=>?
	REQFIL↔0↔0↔0↔0↔0↔0↔0		;100-107 @ABCDEFG
	0↔IVECT↔0↔0↔0↔SETMAR↔0↔0	;110-117 HIJKLMNO
	PVECT↔0↔0↔0↔0↔0↔VECT↔0		;120-127 PQRSTUVW
	0↔0↔0↔0↔0↔0↔0↔0			;130-137 XYZ[\]↑←
	0↔0↔0↔0↔0↔0↔0↔0			;140-147 `abcdefg
	0↔0↔0↔0↔0↔0↔0↔0			;150-157 hijklmno
	0↔0↔0↔0↔0↔0↔0↔0			;160-167 pqrstuvw
	0↔0↔0↔0				;170-173 xyz{
	0↔XPRINT↔0				;174-176 |~}
	[CALL (GETCHM)↔ADD COL↔JUMPL XPRINT
	 DAC COL↔GO XPRINT]		;177

;SPACE PART OF PAGE DOWN
PARTPG:	LAC 1,ROW↔SUB 1,ROWMIN↔IMUL 1,0↔LAC 3,ROWMAX
	SUB 3,ROWMIN↔IDIV 1,3↔ADDI 1,1↔IMUL 1,3↔IDIV 1,0
	ADD 1,ROWMIN↔DAC 1,ROW↔GO ROWCHK

;INC. POSITION
SXINC:	CALL(GETCHM)↔ADDM 1,COL↔POPJ P,
SYINC:	CALL(GETCHM)↔ADDM 1,ROW↔POPJ P,

;SWITCH FONTS
CHGFNT:	CAILE 1,MAXFONT+"0"↔GO[OUTSTR[ASCIZ/ILLEGAL FONT NUMBER:/]
			CALL(ONECHR)↔GO XPRINT]
	SKIPE 2,FONTAB-"0"(1)
	GO [DETSEG
	    ATTSEG 2,↔GO[OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY!/]
			 HALT .+1]
	    CALL(SETFNT)↔GO XPRINT]
	OUTSTR [ASCIZ/UNDEFINE CHARACTER SET #/]
	OUTCHR 1
	GO XPRINT

;INDIRECT FILE
REQFIL:	CALL(INITXT)↔GO[OUTSTR[ASCIZ/REQUIRED TEXT FILE NOT FOUND
/]↔GO XPRINT]
	OUTSTR[ASCIZ/REQUIRE TEXT COMMAND SEEN.
/]↔	GO XPRINT

;SET MARGINS
SETMAR:	CALL(GETCHM)↔LAC 3,1↔CALL(RDNUM)
	JUMPL 1,BADMAR
	CAIN 3,"L"↔GO[CAML RMAR↔GO BADMAR↔DAC LMAR↔DAC COL↔GO XPRINT]
	CAIN 3,"R"↔GO[CAIG 1,NCOLS↔CAMG LMAR↔GO BADMAR↔DAC RMAR↔GO XPRINT]
	CAIN 3,"T"↔GO[CAML ROWMAX↔GO BADMAR↔DAC ROWMIN↔CAML ROW
		DAC ROW↔GO XPRINT]
	CAIN 3,"B"↔GO[CAIG MROWS↔CAMG ROWMIN↔GO BADMAR↔DAC ROWMAX
		CAML ROW↔GO XPRINT↔GO FORMFEED]
BADMAR:	OUTSTR[ASCIZ/ILLEGAL MARGIN COMMAND /]↔OUTCHR 3↔CRLF↔GO XPRINT


VECT:	CALL(RDPAIR)↔GO VLOSE↔CALL(PLTVEC,3,0)↔GO XPRINT
IVECT:	CALL(RDPAIR)↔GO VLOSE↔DAC 3,COL↔DAC ROW↔GO XPRINT
PVECT:	CALL(RDPAIR)↔GO VLOSE↔DAC 3,COL↔DAC ROW↔CALL(PLTVEC,3,0)
	GO XPRINT
VLOSE:	OUTSTR[ASCIZ/VECTOR OFF SCREEN
/]↔	GO XPRINT
;XAP DOCUMENTATION.
COMMENT∞	XAP - XEROR ASSEMBLE AND PRINT.
		Bruce g. Baumgart & Tovar Mock.

XAP converts text, graphics and video into XGP binary rasters.
	PRINTIBLE PAGE SIZE 7.5" BY 10"
	7.5" IS 40 WORDS PER LINE IS 1440 XCOLUMNS.
	10" IS 2000 XROWS.
	BUFFER SIZE IS (41 WORDS PER ROW)*(2000 ROWS) = 82000 WORDS.

OLDE XAP FONT FILE FORMAT.
FONT:	BLOCK 177	; =128 WORD GLYPH POINTER TABLE.
GLYPH1:	XWD ROWS,WORDS	;ROWS IN THE GLYPH, WORD WIDTH OF GLYPH.
	XWD R0,C0	;GLYPH ORIGIN RELATIVE TO PEN POSITION.
	XWD R1,C1	;GLYPH TERMINUS RELATIVE TO PEN POSITION.
	BLOCK ROWS*WORDS
;XAP TILDE COMMANDS.

The XAP escape character is TILDE, "~", ASCII 32 octal.

1. DECLARE A FONT.
	~M<n><font file name>

2. SELECT A FONT.
	~F<n>	select font <n>.
	~f<n>	one character only.
	~{<n>	declare curly brackets as font <n> delimiters.

	Works for ` { ( [ ⊂ < ≤ that is curly brackets
parens, square brackets, left and right horse shoes, left and
right angle brackets "<>", left and right anglebar brackets "≤≥".

3. VECTORS.
	~V<row>,<column>	visible vector.
	~I<row>,<column>	invisible vector.
	~D<row>,<column>	dashed vector.

4. CIRCULAR ARCS.
5. GENERAL ARCS.
6. III BUFFERS.

7. INDIRECT TEXT FILES.

8. VIDEO IMAGES.

9. ESCAPE CHARACTER COMMANDS.
	~~	Quote escape character.
		change escape character.
;XAP RUBOUT COMMANDS.

These commands are preceded with  RUBOUT '177.

The  escape characters  which  print hidden  characters  on LPT  will
output  the same  characters on the  XGP if  they are defined  in the
character set currently  being used.  The  line spacing commands  for
the LPT  should also  do the same  on the XGP  with the  exception of
'177 '21 (line space over page boundary).

0-9			Select character set number specified by digit.
λ<file>→<digit>		Define character set number and load set into upper
			segment.
<space><char.>		Takes octal value of character to be number of bits
			to LAC right.
<rubout><char.>		Takes octal value of character to be number of bits
			to LAC left.
MR<number>		Set Right margin to <number> (in  XGP co-ordinates).
ML<number>		Set Left margin to <number> (in XGP co-ordinates).
MB<number>		Set Bottom margin to <number> (in XGP co-ordinates).
MT<number>		Set Top margin to <number> (in XGP co-ordinates).
V<number><number>	Visible vector to <number>,<number> (in XGP points).
I<number><number>	Invisible vector to <number>,<number> (in XGP points).
P<number><number>	Point vector to <number>,<number> (in XGP points).
<altmode>		No-op (when placed in text, if not deleted explicitly
			protects a line from being changed by TV or E).
@<file><crlf>		Inserts file at this point in listing.
⊗<char><file><crlf>	Inserts III buffer at this point in file, relocated
			by current position and multiplied by char/64. When
			finished leaves cursor at same position.
<number>		Defined by two character.  Equal to:
			(CHAR1-'100)*'200+CHAR2. A SAIL procedure to generate
			a number would be:
			STRING PROCEDURE MAKNUM(INTEGER X);
			RETURN(((X % 200)+'100) & (X LAND '177));

RPG Mode:
Start at starting address + 1 with accumulator contents:
4:7	Text file name↔ extesion↔ 0↔ ppn
10:13	Font file name↔ extesion↔ 0↔ ppn (must be completely specified)
14	Font number for font

∞;
END SA